跳到主要内容

Rive 事件

⚠️ 警告:此功能已弃用,仅支持旧版运行时,不支持当前运行时。请改用数据绑定来替代事件。

概览

Rive 事件允许你在编辑器中定义事件,并在运行时通过代理方法接收这些事件。事件可以是通用事件(携带自定义属性)或打开 URL 事件。

通过状态机代理订阅事件

要订阅 Rive 事件,请实现 StateMachineDelegate 中的 onRiveEventReceived 协议。

@objc optional func onRiveEventReceived(onRiveEvent riveEvent: RiveEvent)

当 Rive 事件从渲染循环触发时,此实现可能被调用,并提供一个通用的 RiveEvent 数据类型。你可以进行类型检查以转换为特定事件进行进一步解析,例如 RiveGeneralEventRiveOpenUrlEvent

例如:

@objc func onRiveEventReceived(onRiveEvent riveEvent: RiveEvent) {
debugPrint("Event Name: \(riveEvent.name())")
debugPrint("Event Type: \(riveEvent.type())")
if let openUrlEvent = riveEvent as? RiveOpenUrlEvent {
// 例如,打开 URL
} else if let generalEvent = riveEvent as? RiveGeneralEvent {
// 例如,打印 Text 组件中提供的字符串数据
}
}

注意: 类型为 RiveOpenUrlEvent 的事件不会自动在用户首选浏览器中打开链接。你需要添加逻辑来获取传入代理的 riveEventurl 属性并打开链接。

示例用法

import SwiftUI
import RiveRuntime

struct SwiftEvents: DismissableView {
var dismiss: () -> Void = {}
@StateObject private var rvm = RiveEventsVMExample()

var body: some View {
VStack {
rvm.view()
Text("Event Message")
.font(.headline)
.padding(.bottom, 10)
Text(rvm.eventText)
.padding()
.background(rvm.eventText.isEmpty ? Color.clear : Color.black)
.foregroundColor(.white)
.cornerRadius(10)
}
}
}

class RiveEventsVMExample: RiveViewModel {
@Published var eventText = ""

init() {
super.init(fileName: "rating_animation")
}

func view() -> some View {
return super.view().frame(width: 400, height: 400, alignment: .center)
}

// 订阅 Rive 事件,此代理将被调用
@objc func onRiveEventReceived(onRiveEvent riveEvent: RiveEvent) {
if let openUrlEvent = riveEvent as? RiveOpenUrlEvent {
if let url = URL(string: openUrlEvent.url()) {
#if os(iOS)
UIApplication.shared.open(url)
#else
NSWorkspace.shared.open(url)
#endif
}
} else if let generalEvent = riveEvent as? RiveGeneralEvent {
let genEventProperties = generalEvent.properties();
if let msg = genEventProperties["message"] {
eventText = msg as! String
}
}

}
}

其他资源

有关 Rive 事件系统的更多信息,请参见 Rive 编辑器文档。